package codec

import (
	"encoding/json"
	"errors"
)

// ############################################### 接 口 封 装 ##########################################################
type JsonCodec struct{}

// 对传入的二进制流进行序列化
func (J JsonCodec) Marshal(v interface{}) ([]byte, error) {
	if v == nil {
		return nil, errors.New("unable to marshal nil v!")
	}
	// 返回的是一个二进制的数据流
	return json.Marshal(v)
}

// 对传入二进制数据流进行反序列化
func (J JsonCodec) Unmarshal(data []byte, v interface{}) error {
	if data == nil {
		return errors.New("unable to unmarshal nil data!")
	}
	// 将反序列化的数据赋值给传入的指针
	return json.Unmarshal(data, v)
}

// 返回一个json字符串
func (J JsonCodec) String() string { return "Json" }

/*
######################################### 封 装 为 公 共 方 法 随 时 调 用 #######################################
*/
// json 序列化
func JsonMarshal(data interface{}) ([]byte, error) {
	if data == nil {
		return nil, errors.New("unable to unmarshal nil data!")
	}
	return json.Marshal(data)
}

// json 反序列化
func JsonUnmarshal(data []byte, v interface{}) error {
	if data == nil {
		return errors.New("unable to unmarshal nil data!")
	}
	return json.Unmarshal(data, v)
}
